home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / misc / math / MathFX_src.lha / fxlclp.c < prev    next >
C/C++ Source or Header  |  1995-12-20  |  2KB  |  68 lines

  1. /* Draws a (x1,y1) to (x2,y2) within the clip limits */
  2.  
  3. #include "mathfx.h"
  4.  
  5.  
  6.  
  7. #define betw(ix,ia,ib) ((ix<=ia && ix>=ib) || (ix>=ia && ix<=ib))
  8. #define inside(ix,iy) (betw(ix,clpxmi,clpxma) && betw(iy,clpymi,clpyma))
  9. #define ixcut(iy) round((float)((x2-x1)*(iy-y1)+x1*(y2-y1))/(float)(y2-y1))
  10. #define iycut(ix) round((float)((y2-y1)*(ix-x1)+y1*(x2-x1))/(float)(x2-x1))
  11.  
  12. void fxlclp(x1,y1,x2,y2)
  13. int x1,y1,x2,y2;
  14. {
  15.       int xt[2],yt[2];
  16.       int it, k;
  17.       int clpxmi,clpxma,clpymi,clpyma;
  18.  
  19.       gclp(&clpxmi,&clpxma,&clpymi,&clpyma);
  20.       k=0;
  21.       if (inside(x1,y1)) {
  22.         xt[k]=x1;
  23.         yt[k]=y1;
  24.         k=k+1;
  25.       }
  26.       if (inside(x2,y2)) {
  27.         xt[k]=x2;
  28.         yt[k]=y2;
  29.         k=k+1;
  30.       }
  31.       if (k == 2) goto draw;
  32.       if (y1 != y2) {
  33.         it=ixcut(clpymi);
  34.         if (inside(it,clpymi) && betw(clpymi,y1,y2)) {
  35.           xt[k]=it;
  36.           yt[k]=clpymi;
  37.           k=k+1;
  38.         }
  39.         if (k == 2) goto draw;
  40.         it=ixcut(clpyma);
  41.         if (inside(it,clpyma) && betw(clpyma,y1,y2)) {
  42.           xt[k]=it;
  43.           yt[k]=clpyma;
  44.           k=k+1;
  45.         }
  46.         if (k == 2) goto draw;
  47.       }
  48.       if (x1 != x2) {
  49.         it=iycut(clpxmi);
  50.         if (inside(clpxmi,it) && betw(clpxmi,x1,x2)) {
  51.           xt[k]=clpxmi;
  52.           yt[k]=it;
  53.           k=k+1;
  54.         }
  55.         if (k == 2) goto draw;
  56.         it=iycut(clpxma);
  57.         if (inside(clpxma,it) && betw(clpxma,x1,x2)) {
  58.           xt[k]=clpxma;
  59.           yt[k]=it;
  60.           k=k+1;
  61.         }
  62.         if (k == 2) goto draw;
  63.       }
  64. draw:
  65.       if (k == 2) genlin(xt[0],yt[0],xt[1],yt[1]);
  66.       scurr(x2,y2);
  67.